const { validationResult } = require('express-validator');
const Message = require('../models/Message');

class MessageController {
  /**
   * 获取用户的消息列表
   * 支持按消息类型筛选：like(点赞消息)、comment(评论消息)
   * 支持分页
   */
  static async getUserMessages(req, res) {
    try {
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.status(400).json({ success: false, message: '参数验证失败', errors: errors.array() });
      }

      const userId = req.user.id;
      const { type, page = 1, limit = 20 } = req.query;

      // 验证类型参数
      if (type && !['like', 'comment'].includes(type)) {
        return res.status(400).json({ success: false, message: '无效的消息类型' });
      }

      // 获取消息列表
      const { count, rows: messages } = await Message.getUserMessages(userId, type, page, limit);

      res.json({
        success: true,
        data: {
          messages: messages,
          pagination: {
            total: count,
            page: parseInt(page),
            limit: parseInt(limit),
            totalPages: Math.ceil(count / limit)
          }
        }
      });
    } catch (error) {
      console.error('获取用户消息列表失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  /**
   * 获取用户未读消息数量
   * 可选择按消息类型获取
   */
  static async getUnreadCount(req, res) {
    try {
      const userId = req.user.id;
      const { type } = req.query;

      // 验证类型参数
      if (type && !['like', 'comment'].includes(type)) {
        return res.status(400).json({ success: false, message: '无效的消息类型' });
      }

      // 获取未读消息数量
      const unreadCount = await Message.getUnreadCount(userId, type);

      // 如果没有指定类型，获取各类消息的数量
      let likeCount = 0;
      let commentCount = 0;

      if (!type) {
        likeCount = await Message.getUnreadCount(userId, 'like');
        commentCount = await Message.getUnreadCount(userId, 'comment');
      }

      res.json({
        success: true,
        data: {
          total: unreadCount,
          ...(!type && {
            likeCount: likeCount,
            commentCount: commentCount
          })
        }
      });
    } catch (error) {
      console.error('获取未读消息数量失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  /**
   * 标记单条消息为已读
   */
  static async markAsRead(req, res) {
    try {
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.status(400).json({ success: false, message: '参数验证失败', errors: errors.array() });
      }

      const userId = req.user.id;
      const messageId = req.params.id;

      // 标记消息为已读
      const [affectedRows] = await Message.markAsRead(messageId, userId);

      if (affectedRows === 0) {
        return res.status(404).json({ success: false, message: '消息不存在或无权操作' });
      }

      res.json({
        success: true,
        message: '标记已读成功'
      });
    } catch (error) {
      console.error('标记消息已读失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  /**
   * 标记所有消息为已读
   * 可选择按消息类型标记
   */
  static async markAllAsRead(req, res) {
    try {
      const userId = req.user.id;
      const { type } = req.query;

      // 验证类型参数
      if (type && !['like', 'comment'].includes(type)) {
        return res.status(400).json({ success: false, message: '无效的消息类型' });
      }

      // 标记所有消息为已读
      const [affectedRows] = await Message.markAllAsRead(userId, type);

      res.json({
        success: true,
        message: '标记全部已读成功',
        data: {
          affectedRows: affectedRows
        }
      });
    } catch (error) {
      console.error('标记全部已读失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }

  /**
   * 删除消息
   */
  static async deleteMessage(req, res) {
    try {
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
        return res.status(400).json({ success: false, message: '参数验证失败', errors: errors.array() });
      }

      const userId = req.user.id;
      const messageId = req.params.id;

      // 查找消息并验证所有权
      const message = await Message.findOne({
        where: {
          id: messageId,
          to_user_id: userId
        }
      });

      if (!message) {
        return res.status(404).json({ success: false, message: '消息不存在或无权操作' });
      }

      // 执行软删除
      await message.destroy();

      res.json({
        success: true,
        message: '删除消息成功'
      });
    } catch (error) {
      console.error('删除消息失败:', error);
      res.status(500).json({ success: false, message: '服务器错误', error: error.message });
    }
  }
}

module.exports = MessageController;